package process

import (
	"errors"
	"ferry/global/orm"
	process2 "ferry/models/process"
	"ferry/pkg/pagination"
	"ferry/tools"
	"ferry/tools/app"
	"github.com/gin-gonic/gin"
)

/*
  @Author : ccg
*/

// 创建项目名称
func CreateSubject(c *gin.Context) {
	var (
		err          error
		subjectValue process2.Subject
		subjectCount int
	)

	// 绑定数据
	err = c.ShouldBind(&subjectValue)
	if err != nil {
		app.Error(c, -1, err, "")
		return
	}

	// 判断创建的项目名称是否存在
	err = orm.Eloquent.Table("p_process_subject").Where("name = ?", subjectValue.Name).Where("`delete_time` IS NULL").Count(&subjectCount).Error
	if err != nil {
		app.Error(c, -1, err, "")
		return
	}

	if subjectCount > 0 {
		app.Error(c, -1, errors.New("创建的项目名称已经存在"), "")
		return
	}

	//	获取创建者即登录的用户
	subjectValue.Creator = tools.GetUserId(c)

	// 创建
	err = orm.Eloquent.Table("p_process_subject").Create(&subjectValue).Error
	if err != nil {
		app.Error(c, -1, err, "")
		return
	}
	app.OK(c, "", "创建项目名称成功")

}

// 项目名称列表
func SubjectList(c *gin.Context) {
	type subjectValue struct {
		process2.Subject
		CreateUser string `json:"create_user"`
		CreateName string `json:"create_name"`
	}

	var (
		err         error
		subjectList []*subjectValue
	)
	SearchParams := map[string]map[string]interface{}{
		"like": pagination.RequestParams(c),
	}

	// gorm 多表联合查询（left join）
	// 注意：这里需要使用别名as create_user，映射返回值结构体，并且因为查找的时候struct字段中的大写会被转义成“_”，所以别名也要将大写转为“_”。
	db := orm.Eloquent.Model(&process2.Subject{}).Joins("left join sys_user on sys_user.user_id = p_process_subject.creator").Select("p_process_subject.*, sys_user.username as create_user, sys_user.nick_name as create_name").Where("p_process_subject.`delete_time` IS NULL")

	result, err := pagination.Paging(&pagination.Param{
		C:  c,
		DB: db,
	}, &subjectList, SearchParams, "p_process_subject")

	if err != nil {
		app.Error(c, -1, err, "")
		return
	}
	app.OK(c, result, "获取项目名称列表成功")
}

// 更新项目名称
func UpdateSubject(c *gin.Context) {
	var (
		err          error
		subjectValue process2.Subject
	)
	// 绑定数据
	err = c.ShouldBind(&subjectValue)
	if err != nil {
		app.Error(c, -1, err, "")
		return
	}

	//	更新
	err = orm.Eloquent.Model(&subjectValue).Where("id = ?", subjectValue.Id).Update("name", subjectValue.Name).Error

	if err != nil {
		app.Error(c, -1, err, "")
		return
	}
	app.OK(c, subjectValue, "更新项目名称成功")
}

// 删除项目名称
func DeleteSubject(c *gin.Context) {
	subjectId := c.DefaultQuery("subjectId", "")

	if subjectId == "" {
		app.Error(c, -1, errors.New("参数传递失败，查看SubjectId是否传递"), "")
		return
	}

	err := orm.Eloquent.Delete(process2.Subject{}, "id = ?", subjectId).Error
	if err != nil {
		app.Error(c, -1, err, "")
		return
	}
	app.OK(c, "", "项目名称删除成功")
}
